mongodb 与 c++ 的配合使用
最近在尝试使用 mongodb 作为服务端持久化方案,服务端程序是使用 c++ 写的,折腾了不少时间,记录一下吧。
1、下载 boost 1.56.0
http://www.boost.org/users/history/version_1_56_0.html
2、下载 mongo-cxx-driver-legacy-1.0.2
https://github.com/mongodb/mongo-cxx-driver/releases/tag/legacy-1.0.2
3、还有其它的一些限制条件,如 gcc 4.8.2 ,安装 scons ,python 2.7.9
4、先升级好 gcc,将注意在 /usr/bin 目录下做好 cc/c++/gcc/g++ 的软链接,且将 libstdc++.so.6 文件复制到 /usr/lib64 目录下;然后安装 boost,将默认安装在 /usr/local/lib/ 目录下的动态库复制到 /usr/lib64 目录下。
5、解压 mongo-cxx-driver-legacy-1.0.2 进入目录后进行编译:
scons all -j8
编译后生成的头文件和静态库存放在 build/install/ 目录下,这些都是 mongodb 的 c++ 驱动程序最终需要的。
6、编写测试代码 test.cpp :
#include <iostream> #include "mongo/client/dbclient.h" int main() { try { mongo::DBClientConnection conn; conn.connect("127.0.0.1"); std::cout<<"connected ok"<<std::endl; } catch(mongo::DBException &e) { std::cout <<e.what()<<std::endl; } }
编译此测试代码的命令为:
g++ test.cpp -I include/ -L lib/ -lmongoclient -lboost_system -lboost_regex -lboost_thread
注意,此处省略了一些简单的细节,如 include 目录下存放了 mongo 和 boost 的头文件,lib 目录下存放了后面指明的四个链接库。
更多使用方法,请参考官方资料:https://github.com/mongodb/mongo-cxx-driver/wiki/Tutorial
详细的API,请参考:http://api.mongodb.org/cxx/legacy-1.0.0/namespacemongo.html
7、遇到了哪些问题?
GCC\BOOST版本过高或过低时,都会有问题,而这个问题是很难排查的,如果本身机器上就存在不同版本的GCC/BOOST,那么升级时一定要注意顺序:先升级PYTHON,再安装好SCONS,再升级GCC并配置好环境,再用新的GCC去编译BOOST,用新的BOOST完全替换掉系统中原本存在的BOOST(否则可能编译过了,但运行会出现段错误;或者在链接 boost_thread 时出错,只能链接 boost_thread-mt ,但后者会影响到使用BOOST写的服务端底层的编译)
8、还有一些有待进一步深入的问题
mongodb 的 c++ 驱动有四个版本(实质上应该是三个),一是我们现在使用的 legacy 版本;二是 26compat 版本;三是使用 c++11 重写的新版本;四是 mongodb 开源程序中自带了 c++ 驱动,应该是前面三种中的一种。
理论上应该使用 c++11 的新版本,这样或者就可以把GCC/BOOST都升到最高版本,是未来的趋势。但得等有时间才能去折腾了,暂时先这样用着吧。
所有的 mongo-cxx-driver 可以在下面的地址下载:
https://github.com/mongodb/mongo-cxx-driver
9、封装
封装以方便使用,待补充。